// 1.函数声明（Function Declaration）:
/*
优点
    函数提升：函数声明在编译阶段会被提升，因此可以在函数声明之前调用它。(类似于变量提升)
    清晰的语法：函数声明的语法简单明了，易于阅读和理解。
缺点
    全局污染：在全局作用域中声明函数可能会导致命名冲突。
    缺乏灵活性：函数声明不适用于动态创建函数。
*/

function myFunction(arg1, arg2) {
    // 函数体
    console.log(arg1, arg2);
}
// 2.函数表达式
/*
优点
    灵活性：可以将函数作为变量赋值，适用于动态创建函数。
    局部作用域：可以避免全局污染，特别适用于闭包。
缺点
    函数只能在声明之后调用。
*/
let myFunction2 = function (arg1, arg2) {
    // 函数体
    console.log(arg1, arg2);
};
// 可用箭头函数简写
// 缺点：没有自己的this 而是继承自外部作用域
// 箭头函数没有 arguments 对象。
let myFunction2copy = (arg1, arg2) => {
    // 函数体
    console.log(arg1, arg2);
}
// 3.动态函数
/*
优点：
    提高代码灵活性：可以在运行时根据需要动态生成函数。
    动态代理：可以在不修改原始对象的情况下，动态添加行为到对象的方法。
    异步编程：可以用来处理异步操作，而无需使用回调函数
缺点：
    可读性和维护性差：动态创建的代码可能难以阅读和理解，特别是对于不熟悉的开发者。
    性能问题：过度使用动态函数可能会导致性能问题，因为JavaScript引擎可能无法优化动态生成的代码。
    调试困难：动态创建的代码可能更难调试，因为它不是静态的。
*/
let myFunction3 = new Function('arg1', 'arg2', 'console.log(arg1, arg2);');